package 常用API.BigDecimal_挺重要的;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Test {
    public static void main(String[] args) {
        // 解决失真
        System.out.println(1.0 - 0.32);//0.6799999999999(失真现象)

        // 目标: 掌握BigDecimal进行精确运算的方案
        double a = 0.1;
        double b = 0.2;

        // 1. 把浮点型数据封装成BigDecimal对象,再来参与运算.
        // a, public BigDecimal(double val) 得到的BigDecimal对象是无法精确计算浮点型数据的. 注意: 不推荐使用这个.
        // b, public BigDecimal(String val) 得到的BigDecimal对象是可以无法精确计算浮点型数据的. 可以使用
        // c, public static BigDecimal valueOf(double val): 通过这个静态方法得到的BigDecimal对象是可以精确运算的.是最好的方法
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);

        // 2. add(BigDecimal augend);  加法
        BigDecimal c1 = a1.add(b1);
        System.out.println(c1);

        // 3. subtract(BigDecimal augend);   减法
        BigDecimal c2 = a1.subtract(b1);
        System.out.println(c2);

        // 4. multiply(BigDecimal augent);   乘法
        BigDecimal c3 = a1.multiply(b1);
        System.out.println(c3);

        // 5. divide(BigDecimal augent);    除法
        BigDecimal c4 = a1.divide(b1);
        System.out.println(c4);

//        BigDecimal d1 = BigDecimal.valueOf(0.1);
//        BigDecimal d2 = BigDecimal.valueOf(0.3);
//        BigDecimal d3 = d1.divide(d2);
//        System.out.println(d3);  这样会出错,没有舍入方式

        // 6. divide(另一个BigDecimal对象,精确几位,舍入模式) : 除法, 可以设置精确几位.
        BigDecimal d1 = BigDecimal.valueOf(0.1);
        BigDecimal d2 = BigDecimal.valueOf(0.3);
        BigDecimal d3 = d1.divide(d2,2, RoundingMode.HALF_UP);
        System.out.println(d3);

        // 7. doubleValue() ; 把BigDecimal对象又转化为double类型的数据
        double db1 = d1.doubleValue();

    }
}
